///\file transformation.hpp
///\brief contient les classes de transformations
///rendu OpenGL
#ifndef _TRANSFORMATION
#define _TRANSFORMATION

#include <GL/gl.h>

///\class Transformation
///\brief Définit le modèle générique d'une transformation
class Transformation{
public :
  ///\brief Constructeur
  inline Transformation(){}
  ///\brief Appliquer la transformation
  virtual void apply() const = 0;
};

///\class Translation
///\brief Définit une translation
class Translation : public Transformation{
private:
  float x; ///< Valeur de translation sur x
  float y; ///< Valeur de translation sur y
  float z; ///< Valeur de translation sur z

public :

  ///\brief Constructeur
  ///permet de construire une translation
  ///\param x valeur sur x de la translation
  ///\param y valeur sur y de la translation
  ///\param z valeur sur z de la translation
  inline Translation(float x, float y, float z) : x(x), y(y), z(z){}

  ///\brief
  ///permet d'appliquer la translation
  inline void apply() const {
    glTranslatef(x,y,z);
  }
};

///\class Rotation
///\brief définit une rotation
class Rotation : public Transformation{
private :
  float angle; ///< Angle de rotation
  int x; ///< valeur du vecteur de l'axe de rotation sur x
  int y; ///< valeur du vecteur de l'axe de rotation sur y
  int z; ///< valeur du vecteur de l'axe de rotation sur z

public :
  ///\brief Constructeur
  ///permet de construire une rotation
  ///\param a angle de rotation
  ///\param x composante x du vecteur de l'axe de rotation
  ///\param y composante y du vecteur de l'axe de rotation
  ///\param z composante z du vecteur de l'axe de rotation
  inline Rotation(float a, int x, int y, int z) : angle(a), x(x), y(y), z(z){}

  ///\brief
  ///permet d'appliquer la rotation
  inline void apply() const{
    glRotatef(angle, x, y, z);
  }
};

#endif
